package com.example.review.utils.sendhttp;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import okhttp3.OkHttpClient;
import okhttp3.Request;

/**
 * 这是一个发送http请求的工具类 包含两个静态方法 sendOkHttpRequest和sendHttpRequest
 */
public class SendHttpUtil {


//    /**
//     * 调用
//     * @param address
//     * @param callback
//     */
//    HttpUtil.sendOkHttpRequest("http://www.baidu.com",new okhttp3.Callback(){
//        @Override
//            public void onResponse (Call call, Response response) throws IOException {
//                // 得到服务器返回的具体内容
//                String responseData = response.body().string();
//                }
//        @Override
//            public void onFailure (Call call, IOException e){
//                // 在这里对异常情况进行处理
//            }
//    });



    public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(address).build();
        client.newCall(request).enqueue(callback);
    }


//    /**
//     * 调用
//     */
//    sendHttpRequest(address, new HttpCallbackListener() {
//        @Override public void onFinish(String response) {
//            // 在这里根据返回内容执行具体的逻辑
//            }
//            @Override public void onError(Exception e) {
//            // 在这里对异常情况进行处理
//            // }
//    });




    /**
     * 改进版本
     * @param address
     * @param listener
     */
    //添加了一个HttpCallbackListener 参数
    public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
        //在方法 的内部开启了一个子线程，然后在子线程里去执行具体的网络操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                    URL url = new URL(address);
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    InputStream in = connection.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        response.append(line);
                    }
                    if (listener != null) {
                        //子线程中是无法通 过return 语句来返回数据的，因此这里我们将服务器响应的数据传入了HttpCallbackListener的 onFinish() 方法中
                        // 回调onFinish()方法
                        listener.onFinish(response.toString());
                    }
                } catch (Exception e) {
                    if (listener != null) {
                        //子线程中是无法通 过return 语句来返回数据的,如果出现了异常就将异常原因传入到onError() 方法中。
                        // 回调onError()方法
                        listener.onError(e);
                    }
                } finally {
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }


    /**
     * 以下版本有缺陷
     * @param address
     * @return
     */


//    以后每当需要发起一条HTTP请求的时候就可以这样写：
//    String address = "http://www.baidu.com";
//    String response = HttpUtil.sendHttpRequest(address);



    //使用httpURL发送get请求
    public static String sendHttpRequest(String address) {
        HttpURLConnection connection = null;
        try {
            URL url = new URL(address);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(8000);
            connection.setReadTimeout(8000);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            //以获取到服务器返回的输入流
            InputStream in = connection.getInputStream();
            // 下面对获取到的输入流进行读取
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            return response.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }



}
